<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>callee</title>
</head>
<body>
<script>
  /*
  * callee有点像方法名的相对引用
  *
  * */

  function f(n) {
    if (n === 1) return 1

    /*
    * 在递归中我们会访问当前函数,这里是硬引用
    * */
    // return n *f(n-1)
    /* arguments.callee值argument所在的函数，也就是当前函数 因为这个值是相对的 所以不管函数名怎么变化
    * 都能被访问到*/
     return n * arguments.callee(n-1)
  }

  console.log(f(5))

  /*硬引用的问题在与原函数名变化后就不会被引用到了*/
  let newF = f
  f = null
  console.log(f(5));
  console.log(newF(5));

  /*
  * 在严格模式下arguments.callee不能访问 我们可以使用NFE进行代替
  * */

  let foo = function fn(n) {
      if (n === 1) return 1
      return n * fn(n - 1)
  }



</script>
</body>
</html>